package com.dynamic.mybatis.core.generator.helper;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
import com.dynamic.mybatis.core.generator.InjectorHelper;
import com.dynamic.mybatis.core.metadata.MappedStatementField;
import com.dynamic.mybatis.core.metadata.MappedStatementTable;

import java.util.Objects;

import static java.util.stream.Collectors.joining;

/**
 * @Description
 * @Author xs
 * @Date 2023/4/14 13:58
 */
public class UpdateInjectorHelper extends InjectorHelper {

    /**
     * SQL 更新 set 语句
     *
     * @param logic  是否逻辑删除注入器
     * @param ew     是否存在 UpdateWrapper 条件
     * @param table  表信息
     * @param alias  别名
     * @param prefix 前缀
     * @return sql
     */
    public static String sqlSet(boolean logic, boolean ew, MappedStatementTable table, boolean judgeAliasNull, final String alias,
                                final String prefix) {
        String sqlScript = UpdateInjectorHelper.getAllSqlSet(table, logic, prefix);
        if (judgeAliasNull) {
            sqlScript = SqlScriptUtils.convertIf(sqlScript, String.format("%s != null", alias), true);
        }
        if (ew) {
            sqlScript += NEWLINE;
            sqlScript += InjectorHelper.convertIfEwParam(U_WRAPPER_SQL_SET, false);
        }
        sqlScript = SqlScriptUtils.convertSet(sqlScript);
        return sqlScript;
    }


    /**
     * 获取所有的 sql set 片段
     *
     * @param ignoreLogicDelFiled 是否过滤掉逻辑删除字段
     * @param prefix              前缀
     * @return sql 脚本片段
     */
    public static String getAllSqlSet(MappedStatementTable table, boolean ignoreLogicDelFiled, final String prefix) {
        final String newPrefix = prefix == null ? EMPTY : prefix;
        return table.getFields().stream()
                .filter(i -> {
                    if (ignoreLogicDelFiled) {
                        return !(i.isLogicDelete());
                    }
                    return true;
                }).map(i -> UpdateInjectorHelper.getSqlSet(i, newPrefix)).filter(Objects::nonNull).collect(joining(NEWLINE));
    }


    /**
     * 获取 set sql 片段
     *
     * @param prefix 前缀
     * @return sql 脚本片段
     */
    public static String getSqlSet(MappedStatementField field, final String prefix) {
        return getSqlSet(field, false, prefix);
    }

    /**
     * 获取 set sql 片段
     *
     * @param ignoreIf 忽略 IF 包裹
     * @param prefix   前缀
     * @return sql 脚本片段
     */
    public static String getSqlSet(MappedStatementField field, final boolean ignoreIf, final String prefix) {
        final String newPrefix = prefix == null ? EMPTY : prefix;
        String update = "";
        // 默认: column=
        String sqlSet = field.getColumn() + EQUALS;
        if (StringUtils.isNotBlank(update)) {
            sqlSet += String.format(update, field.getColumn());
        } else {
            sqlSet += SqlScriptUtils.safeParam(newPrefix + field.getField());
        }
        sqlSet += COMMA;
        if (ignoreIf) {
            return sqlSet;
        }
        if (withUpdateFill) {
            // 不进行 if 包裹
            return sqlSet;
        }
        return convertIf(field, sqlSet, InjectorHelper.convertIfProperty(newPrefix, field.getField()), updateStrategy);
    }


}